#include "../include/defs.h"
#include "../include/kc.h"
#include "../include/sleep.h"
#include "../include/scheluderCommons.h"
#define CUANTUM_MAX 6

extern process_t procesos[];
extern int pidActual;
extern peticion peticionesDormir[];
extern int maxmem;

int indiceX = 0;
int ejecutados[100] = { 0 };
int nivelActual = 0;
int actual = 0;
int vuelta = 0;


int yaPase = 0;
int primero = 1;
int elPrimero = 0;

process_t *
GetNextTask(void) {
	int i;
	int tengoProceso = 0;
	int cant = 0;

	for (i = 0; i < MAXPROCESOS; i++) {
		if (peticionesDormir[i].time != 0) {
			if (--peticionesDormir[i].time == 0)
				desbloqueaProceso(peticionesDormir[i].pid);
		}
	}

	if (NoHayProcesos()) {
		ejecutados[indiceX] = IDLE;
		indiceX = (indiceX + 1) % 100;
		return &procesos[IDLE];
	}

	if (vuelta == CUANTUM_MAX - nivelActual) {
		nivelActual = (nivelActual + 1) % CANT_PRIOR;
		primero = 1;
		vuelta = 0;
		elPrimero = 0;
		yaPase = 0;
	}
	i = ((actual + 1) % MAXPROCESOS < 1) ? 1 : (actual + 1) % MAXPROCESOS;

	while (!tengoProceso) {
		if (i == elPrimero) {
			yaPase = 1;
			if ((vuelta++) == CUANTUM_MAX - nivelActual) {
				nivelActual = (nivelActual + 1) % CANT_PRIOR;
				primero = 1;
				vuelta = 0;
				elPrimero = 0;
				yaPase = 0;
			}
		}

		if (cant == MAXPROCESOS - 1) {
			nivelActual = (nivelActual + 1) % CANT_PRIOR;
			yaPase = 0;
			primero = 1;
			elPrimero = 0;
			cant = 0;
			vuelta = 0;
		}
		if (!procesos[i].free_slot && procesos[i].bloqueado == 0) {
			if (i != IDLE && procesos[i].prioridad == nivelActual) {
				actual = i;
				ejecutados[indiceX] = i;
				indiceX = (indiceX + 1) % 100;
				if (primero) {
					primero = 0;
					elPrimero = i;
					vuelta++;
				} else {
					if (i >= elPrimero && yaPase) {
						vuelta;
						yaPase = 0;
					}
				}
				return &procesos[i];
			}
		}
		cant++;
		i = (i + 1) % MAXPROCESOS < 1 ? 1 : (i + 1) % MAXPROCESOS;
	}
}

int LoadESP(process_t * proc) {
	return proc->ESP;
}
